#include "cupe.h"

#include <TM1668.h>

#if DEBUG_ON == 1
// 将串口1的管脚指定到PA10（RX），PA9(TX)引脚上
HardwareSerial Serial1(PA10, PA9);
#endif

TM1668 module(KEY_DIO, KEY_CLK, KEY_STB, 20, false);

GxIO_Class io;
GxCTRL_Class controller(io);
GxTFT tft(io, controller, 320, 240);

void cupe_init(void)
{
  // 若使用自制Bootloader 则需要将系统向量表地址重定位到0x08001000
#if defined(USE_BOOTLOADER)
  WRITE_REG(SCB->VTOR, 0x08001000);
#endif

  // 初始化IO引脚
  pinMode(PWR_EN, OUTPUT);

  pinMode(PWR_BTN, INPUT_PULLDOWN);

  pinMode(LCD_BL, OUTPUT);

  // 等待1us
  delay(72);

  // PE0 供电引脚电平拉高，使能外部供电
  digitalWrite(PWR_EN, HIGH);

  // 等待直到开关按钮释放(意味着释放电源按钮后系统才继续启动)
  while (digitalRead(PWR_BTN) == HIGH)
    ;

#if DEBUG_ON == 1
  Serial1.begin(115200);
#endif
}

// 电源开关按键检测函数
int cupe_power_key(void)
{
  // 读取PWR_PIN的状态以确认按钮是否被按下（低电平）
  if (digitalRead(PWR_BTN) == HIGH)
  {
    // 延时以消除抖动
    delay(10);
    // 再次读取PWR_PIN的状态以确认按钮仍然被按下
    if (digitalRead(PWR_BTN) == HIGH)
    {
      // 如果按钮仍然被按下（低电平），则等待释放（上升沿）
      while (digitalRead(PWR_BTN) == HIGH)
        ;
      return 1;
    }
  }

  return 0;
}

// PE0 供电引脚电平拉低，禁止外部供电(关机)
void cupe_shutdown()
{
  digitalWrite(PWR_EN, LOW);
}

const char cupeButtons[] = " DUX<K2B580C369#1A47*";

// 读取面板按键值
uint8_t cupe_key()
{
  uint32_t key = module.getButtons();

  for (int i = 0; i < 10; i++)
  {
    if (key & (1 << i))
    {
      return i + 1;
    }
  }

  key >>= 16;
  for (int i = 0; i < 10; i++)
  {
    if (key & (1 << i))
    {
      return i + 11;
    }
  }

  return 0;
}
